Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Flakyなテストを2つ修正した #7997

Merged
merged 6 commits into from
Aug 16, 2024
Merged

Flakyなテストを2つ修正した #7997

merged 6 commits into from
Aug 16, 2024

Conversation

motohiro-mm
Copy link
Contributor

@motohiro-mm motohiro-mm commented Aug 7, 2024

Issue

概要

CircleCIの test insights の中のFlakyなテストから、以下のテストについて修正・追加の実装を行いました。
1:test/system/users.test.rb:436
2:test/system/require_login/users_test.rb:8

各テストにおける修正・追加の実装の説明は以下コメントで記載します。

変更確認方法

  1. chore/fix-flaky-testsをローカルに取り込む
  2. ローカルで以下のテストを実行し落ちないことを確認
  • test/system/users.test.rb:436
  • test/system/require_login/users_test.rb:8
  1. CIを実行し以下のテストが落ちないことを確認
  • test/system/users.test.rb:436
  • test/system/require_login/users_test.rb:8

@motohiro-mm motohiro-mm changed the title [WIP]Chore/fix flaky tests [WIP]Flakyなテストを2つ修正した Aug 9, 2024
@motohiro-mm
Copy link
Contributor Author

motohiro-mm commented Aug 9, 2024

test/system/users.test.rb:436

test_incremental_search_by_description

  test 'incremental search by description' do
    visit_with_auth '/users', 'komagata'
    assert_selector '.users-item', count: 24
    fill_in 'js-user-search-input', with: '木村です'
    assert_text 'Kimura Tadasi', count: 1
  end

出ているエラー

エラー

Failure:
UsersTest#test_incremental_search_by_description [/home/circleci/project/test/system/users_test.rb:440]:
expected to find text "Kimura Tadasi" 1 time but found 0 times in "お知らせ\nプラクティス\n65\n日報・ブログ\n61\n提出物\n14\nQ&A\nDocs\nポートフォリオ\nユーザー\nイベント\n1\n相談\nメンター\n管理者\nメンターモード\nすべて\nお知らせ\nプラクティス\n日報\n提出物\nQ&A\nDocs\nイベント\n定期イベント\nユーザー\nヘルプ\nMe\n5\n通知\nユーザー\n全て\n期生別\nタグ別\nフォロー中\n企業別\n都道府県別\n現役 + 研修生\n現役生\n研修生\nメンター\n卒業生\nアドバイザー\n就職活動中\n休会\n退会\n全員\n現役 + 研修生(29)\n絞り込み\n1\n2\notameshi\nお試し 延長\notameshi1234\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\ntestユーザーです。お試し延長期間テスト用。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\ntom\nTom\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nアメリカ在住のトムです。\n0%\nフォローする\n1ヶ月以上ログインがありません\nneverlogin\n根場亜 呂具印\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nユーザー登録後、1度もログインしていないユーザーです。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nkimuramitai\nKimura Mitai\nkimuradiscord1234\n日報\n1\n提出物\n2\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\n木村さんに似ているとよく言われます。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nenchoowata\n延長 終和太\nenchoowata1234\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nお試し延長キャンペーン終了直後に入会しました。お試し期間は3日間です。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nenchoososhi\n延長 遅始\nenchoososhi1234\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nお試し延長キャンペーンの終了間際に入会しました。お試し期間は7日間です。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nenchohayashi\n延長 早始\nenchohayashi1234\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nお試し延長キャンペーンの開始と同時に入会しました。お試し期間は7日間です。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nenchomaeyo\n延長 前代\nenchomaeyo1234\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nお試し延長キャンペーン直前に入会してしまいました。お試し期間は3日間です。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nenchomaemae\n延長 前々\nenchomaemae1234\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\n早始・遅始さんよりも前のキャンペーンで入会しました。お試し期間は5日間です。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nwith-hyphen\nハイフンありユーザー\nwith_hyphen1234\n日報\n36\n提出物\n46\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nログインネームにハイフン(-)を利用しているユーザーです。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nharikirio\nHari Kirio\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\n必修でないプラクティスも取り組みます!\n3%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\njobseeker\n就活 のぞむ\njobseeker8888\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nフィヨルドからの就職希望してます!\n1%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\ntwitterinvalid\nユーザーです X(Twitter) IDが不正\ntwitterinvalid#8888\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nX(Twitter) IDが不正なユーザーです\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nnocompanykensyu\n研修 会社無男\nnocompanykensyu9999\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\n所属企業がない研修生です。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nkananashi\nユーザーです 読み方のカナが無い\nkananashi6666\n日報\n4\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\n読み方のカナが無いユーザーです\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nosnashi\nユーザーです OSが無い\nosnashi7777\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nOSが無いユーザーです\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\ndiscordinvalid\nユーザーです Discord IDが不正\ndiscordinvalid#1234567890\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nDiscord IDが不正なユーザーです\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nkensyu\nKensyu Seiko\nkensyu3333\n日報\n5\n提出物\n2\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\n研修聖子です。\nギター\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nnippounashi\nNippou nashi\nnippounashi0001\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\n日報がないユーザーです。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nmuryou\nMuryou Nosuke\nmuryou2222\n日報\n0\n提出物\n1\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\n無料の助です。趣味は野良犬剣法です。\n1%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nhajime\nHajime Tayo\n日報\n5\n提出物\n2\nコメント\n2\n質問\n3\n回答\n0\nポートフォリオ\n0\n始です。テストです。\n猫\n中級者\n3%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\nhatsuno\nHatsuno Shinji\n日報\n3\n提出物\n1\nコメント\n0\n質問\n2\n回答\n0\nポートフォリオ\n1\n初野です。課金しています。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\npaginataion-taro\nページネーション 太郎\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nページネーションを確認するため追加したユーザーです。\n0%\nフォローする\n相談部屋\n1ヶ月以上ログインがありません\npaginataion-jirou\nページネーション 次郎\n日報\n0\n提出物\n0\nコメント\n0\n質問\n0\n回答\n0\nポートフォリオ\n0\nページネーションを確認するため追加したユーザーです。\n0%\nフォローする\n相談部屋\n1\n2\nユーザータグ\nMay_J.\n1\n初心者\n1\n中級者\n1\n猫\n3\nデザイナー\n1\nshinjuku.rb\n1\nマンガ\n1\nneovim_v0.5.0\n1\n.NET_Framework\n1\nゲーム\n1\nギター\n2\nもっとみる\n気になるユーザーをフォローしてみよう!自分が誰をフォローしているかを知られることはありません。くわしくはこちら\nホームページ\nブログ\n参考書籍\nGitHub Projects\nグッズ購入\nアンチハラスメントポリシー\n利用規約\nプライバシーポリシー\n特定商取引法に基づく表記\nコース一覧\n企業一覧\n#fjordbootcamp\nFjord Choice\nBuzzcord\nDiscordBotF\nFBC Stack\nLokka Inc.2012 - 2024"

https://app.circleci.com/pipelines/github/fjordllc/bootcamp/10353/workflows/a68be06d-6243-4953-ba08-e2e43ccdd16d/jobs/37396

スクリーンショット

  • エラー内容とスクリーンショットからユーザー検索が実行されていないことが原因
  • 現在ユーザーの検索は、文字を入力したあと、入力エリアから離れると検索が行われ表示されるので、その動きが必要

対策

  • find('#js-user-search-input').send_keys :returnで、文字入力後にreturnキーを押す動作を追加した
    1189300

@motohiro-mm
Copy link
Contributor Author

motohiro-mm commented Aug 9, 2024

test/system/require_login/users_test.rb:8

test_cannot_access_users_list_without_login

  test 'cannot access users list without login' do
    assert_login_required('/users')
  end

test/supports/login_assert_helper.rb:4

  def assert_login_required(path)
    visit path
    assert_text 'ログインしてください'
    assert_selector 'h3', text: 'フィヨルドブートキャンプとは?'
  end

出ているエラー

エラー

Error:
UsersLoginTest#test_cannot_access_users_list_without_login:
ActiveStorage::FileNotFoundError: ActiveStorage::FileNotFoundError
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/lib/active_storage/service/disk_service.rb:145:in `rescue in stream'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/lib/active_storage/service/disk_service.rb:138:in `stream'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/lib/active_storage/service/disk_service.rb:29:in `block in download'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/notifications.rb:203:in `block in instrument'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/notifications.rb:203:in `instrument'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/lib/active_storage/service.rb:155:in `instrument'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/lib/active_storage/service/disk_service.rb:28:in `download'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/app/models/active_storage/blob.rb:259:in `download'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/app/controllers/active_storage/base_controller.rb:13:in `stream'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/app/controllers/active_storage/blobs/proxy_controller.rb:11:in `block in show'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal/conditional_get.rb:278:in `http_cache_forever'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activestorage-6.1.4.7/app/controllers/active_storage/blobs/proxy_controller.rb:9:in `show'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/abstract_controller/base.rb:228:in `process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal/rendering.rb:30:in `process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/callbacks.rb:117:in `block in run_callbacks'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/react-rails-3.1.1/lib/react/rails/controller_lifecycle.rb:33:in `use_react_component_helper'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/callbacks.rb:126:in `block in run_callbacks'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/active_decorator-1.4.1/lib/active_decorator/view_context.rb:37:in `block (3 levels) in <module:Filter>'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/active_decorator-1.4.1/lib/active_decorator/view_context.rb:25:in `run_with'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/active_decorator-1.4.1/lib/active_decorator/view_context.rb:36:in `block (2 levels) in <module:Filter>'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/callbacks.rb:126:in `instance_exec'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/callbacks.rb:126:in `block in run_callbacks'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actiontext-6.1.4.7/lib/action_text/rendering.rb:20:in `with_renderer'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actiontext-6.1.4.7/lib/action_text/engine.rb:59:in `block (4 levels) in <class:Engine>'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/callbacks.rb:126:in `instance_exec'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/callbacks.rb:126:in `block in run_callbacks'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/callbacks.rb:137:in `run_callbacks'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/abstract_controller/callbacks.rb:41:in `process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal/rescue.rb:22:in `process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/notifications.rb:203:in `block in instrument'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/notifications.rb:203:in `instrument'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal/instrumentation.rb:33:in `process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal/params_wrapper.rb:249:in `process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activerecord-6.1.4.7/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/abstract_controller/base.rb:165:in `process'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionview-6.1.4.7/lib/action_view/rendering.rb:39:in `process'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal.rb:190:in `dispatch'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_controller/metal.rb:254:in `dispatch'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/routing/route_set.rb:33:in `serve'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/journey/router.rb:50:in `block in serve'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/journey/router.rb:32:in `each'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/journey/router.rb:32:in `serve'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/routing/route_set.rb:842:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/static.rb:24:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/omniauth-2.1.1/lib/omniauth/strategy.rb:202:in `call!'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/omniauth-2.1.1/lib/omniauth/strategy.rb:169:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/omniauth-2.1.1/lib/omniauth/strategy.rb:202:in `call!'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/omniauth-2.1.1/lib/omniauth/strategy.rb:169:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/omniauth-2.1.1/lib/omniauth/builder.rb:44:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/tempfile_reaper.rb:15:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/etag.rb:27:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/conditional_get.rb:27:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-user_agent-0.5.3/lib/rack/user_agent.rb:16:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/head.rb:12:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/http/permissions_policy.rb:22:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/http/content_security_policy.rb:18:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/session/abstract/id.rb:266:in `context'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/session/abstract/id.rb:260:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/cookies.rb:689:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/callbacks.rb:98:in `run_callbacks'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/executor.rb:14:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rollbar-3.5.2/lib/rollbar/middleware/rails/rollbar.rb:25:in `block in call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rollbar-3.5.2/lib/rollbar.rb:145:in `scoped'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rollbar-3.5.2/lib/rollbar/middleware/rails/rollbar.rb:22:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rollbar-3.5.2/lib/rollbar/middleware/rails/show_exceptions.rb:27:in `call_with_rollbar'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/railties-6.1.4.7/lib/rails/rack/logger.rb:37:in `call_app'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/railties-6.1.4.7/lib/rails/rack/logger.rb:26:in `block in call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/tagged_logging.rb:99:in `block in tagged'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/tagged_logging.rb:37:in `tagged'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/tagged_logging.rb:99:in `tagged'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/railties-6.1.4.7/lib/rails/rack/logger.rb:26:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/request_id.rb:26:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/method_override.rb:24:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/runtime.rb:22:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/activesupport-6.1.4.7/lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/executor.rb:14:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/static.rb:24:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/sendfile.rb:110:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/actionpack-6.1.4.7/lib/action_dispatch/middleware/host_authorization.rb:113:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/railties-6.1.4.7/lib/rails/engine.rb:539:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/urlmap.rb:74:in `block in call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/urlmap.rb:58:in `each'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/urlmap.rb:58:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rack-2.2.8.1/lib/rack/builder.rb:244:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rollbar-3.5.2/lib/rollbar/middleware/rack/builder.rb:16:in `block in call_with_rollbar'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rollbar-3.5.2/lib/rollbar.rb:145:in `scoped'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/rollbar-3.5.2/lib/rollbar/middleware/rack/builder.rb:14:in `call_with_rollbar'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/capybara-3.39.2/lib/capybara/server/animation_disabler.rb:25:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/capybara-3.39.2/lib/capybara/server/middleware.rb:60:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-6.4.2/lib/puma/configuration.rb:272:in `call'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-6.4.2/lib/puma/request.rb:100:in `block in handle_request'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-6.4.2/lib/puma/thread_pool.rb:378:in `with_force_shutdown'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-6.4.2/lib/puma/request.rb:99:in `handle_request'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-6.4.2/lib/puma/server.rb:464:in `process_client'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-6.4.2/lib/puma/server.rb:245:in `block in run'
    /home/circleci/project/vendor/bundle/ruby/3.1.0/gems/puma-6.4.2/lib/puma/thread_pool.rb:155:in `block in spawn_thread'

test (37018) - fjordllc/bootcamp

  • テスト内容とRailsのテストログを見て、welcomeページを開いているときにエラーが起きている
    • その中でもfixturesの添付ファイル(ユーザーアイコンや企業ロゴなど)を読み込むときにエラーになっている
  • 他のテストでも同様のActiveStorage::FileNotFoundError: ActiveStorage::FileNotFoundErrorが出ていることがけっこうある
    • それらも画像アップロードのテストはほとんどなく、ページを開いているときにエラーが出ている可能性が考えられた

調査の流れ

システムテストでは、トランザクションをロールバックすることでテストデータをクリーンアップしますが、destroyはオブジェクトに対して呼び出されないため、添付ファイルはそのままでは決してクリーンアップされません。 添付ファイルを破棄したい場合は、after_teardownコールバックで行えます。このコールバックを実行すると、テスト中に作成されたすべてのコネクションを確実に完了するので、Active Storageでファイルが見つからないというエラーは表示されなくなります。

並列テストとDiskServiceを利用している場合は、Active Storage用の独自のフォルダをプロセスごとに設定する必要があります。これにより、teardownコールバックが呼ばれたときに、関連するプロセスのファイルだけが削除されるようになります。

  • 現在のActiveStorageの設定は、テスト時のアップロード用の保存先もfixtures用の保存先も全て1つのフォルダを共有していた
  • 加えて、Bootcampアプリはテストを並列実行しているが、各プロセスすべてが同じ1つのフォルダを保存先として共有していた

対策

  • ActiveStorageのテスト時の保存先をすべて独立させ、できるだけ競合状態を起こさないようにした
    • ActiveStorageのテスト時の保存先フォルダを、テスト中にアップロードするためのフォルダとfixturesの添付ファイルをアップロードするためのフォルダにわけた
    • ActiveStorageのテスト時の保存先フォルダを並列実行のプロセスごとにわけるようにした
    • ActiveStorageのテスト時の保存先フォルダをテストが終了したら削除するようにした
CIの結果

他テストファイル含むActiveStorage::FileNotFoundError: ActiveStorage::FileNotFoundErrorの回数

修正前:1/10 → 修正後:0/25

@motohiro-mm motohiro-mm self-assigned this Aug 9, 2024
@motohiro-mm motohiro-mm changed the title [WIP]Flakyなテストを2つ修正した Flakyなテストを2つ修正した Aug 9, 2024
@@ -2,31 +2,31 @@
# ActiveStorage::FixtureSet.blob を使うように変更する

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらを参考に、各フィクスチャの保存先を設定しています。
ちなみに、BootcamoアプリはRails6.1であり、RailsガイドにあるようなActiveStorage::FixtureSet.blobという機能はRails7からの機能なのでありませんが、こちらのPRのtest/system/test_helper.rbによってActiveStorage::Blob.fixtureとすることで同等の機能が使用できるようになっています。

@@ -15,6 +15,11 @@ google:
bucket: <%= ENV["GCS_BUCKET"] %>
public: true

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

下記リンクを参考にfixtures用の保存先を作成しています。
Active Storage の概要 - Railsガイド

@@ -32,6 +32,22 @@ class ActiveSupport::TestCase
teardown do
ActiveStorage::Current.host = nil
end

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

こちらを参考にして、並列のプロセスごとに、保存先にそれぞれ番号がふられるように設定しています。

Railsガイドにある書き方はRails7から入った機能です。
Rails6.1で同様のことをするためinstance_variable_setを使用して修正しています。
そしてBootcampアプリがRails7になったときのためにコメントを記載しています。
参考:Parallelizing setup for ActiveStorage doesnt expose setter · Issue #43616 · rails/rails
(ちなみにRails6.1のRailsガイドには並列実行時のテスト用保存先の別名の付け方の記載はありません)

ActiveStorage::Blob.service.instance_variable_set(:@root, "#{ActiveStorage::Blob.service.root}/storage-#{i}")
ActiveStorage::Blob.services.fetch(:test_fixtures).instance_variable_set(:@root, "#{ActiveStorage::Blob.services.fetch(:test_fixtures).root}/fixtures-#{i}")
end

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

アップロード用保存先フォルダに関しては、Railsガイドにはafter_teardownを使用し各テストごとに削除するよう記載してありますが、そのように記載しCIを実行するとActiveStorage::FileNotFoundError: ActiveStorage::FileNotFoundErrorが発生する回数が増えました。
なぜエラーが増えるのか調査しましたが、理由はわかりませんでした。
そのため、テストが全て終了した後にデータをクリーンアップするように設定しています。

@motohiro-mm motohiro-mm marked this pull request as ready for review August 9, 2024 09:25
@motohiro-mm
Copy link
Contributor Author

motohiro-mm commented Aug 9, 2024

@kurumadaisuke

おつかれさまです!
お忙しいところ恐縮ですが、こちらのPRのレビューをお願いできますでしょうか🙏
急ぎではありません。
ご都合が合わなかったり、レベル感が合っていない等ありましたら、遠慮なくおっしゃってください🙇‍♀️
よろしくおねがいいたします!

@kurumadaisuke
Copy link
Contributor

@motohiro-mm
少しお時間頂くかと思いますが、確認行います🙏
急ぎだったりしますか?🙏

@motohiro-mm
Copy link
Contributor Author

@kurumadaisuke

急ぎではありません!
ありがとうございます🙏よろしくお願いいたします!

@kurumadaisuke
Copy link
Contributor

@motohiro-mm
お待たせいたしました🙏
ローカルでrails test test/system/users_test.rb:436を実行した際に以下内容が出力されたのですが、これはあんまり関係ないものですかねー?🙇‍♂️(すいませんよくわかっておらず)
CI含め、テスト自体は通っていることは確認できました。

(process:99785): VIPS-WARNING **: 21:39:20.158: unable to load "/usr/local/Cellar/vips/8.14.2_1/lib/vips-modules-8.14/vips-openslide.so" -- dlopen(/usr/local/Cellar/vips/8.14.2_1/lib/vips-modules-8.14/vips-openslide.so, 0x0009): Library not loaded: /usr/local/opt/openslide/lib/libopenslide.0.dylib
  Referenced from: <B1661066-CDAA-346B-8654-2900710436B8> /usr/local/Cellar/vips/8.14.2_1/lib/vips-modules-8.14/vips-openslide.so
  Reason: tried: '/usr/local/opt/openslide/lib/libopenslide.0.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/opt/openslide/lib/libopenslide.0.dylib' (no such file), '/usr/local/opt/openslide/lib/libopenslide.0.dylib' (no such file), '/usr/local/lib/libopenslide.0.dylib' (no such file), '/usr/lib/libopenslide.0.dylib' (no such file, not in dyld cache), '/usr/local/Cellar/openslide/4.0.0/lib/libopenslide.0.dylib' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/usr/local/Cellar/openslide/4.0.0/lib/libopenslide.0.dylib' (no such file), '/usr/local/Cellar/openslide/4.0.0/lib/libopenslide.0.dylib' (no such file), '/usr/local/lib/libopenslide.0.dylib' (no such file), '/usr/lib/libopenslide.0.dylib' (no such file, not in dyld cache)
.
[Minitest::CI] Generating test report in JUnit XML format...

@motohiro-mm
Copy link
Contributor Author

@kurumadaisuke

ご確認いただきありがとうございます!
WARNING、私は出てないですね…

WARNINGの解決策はわかっていないのですが、とりあえず確認していただきたいことを以下に書いておきます↓

  1. libvipsはインストールされてますでしょうか?
    READMEの1は最近追加されたようです。
    ImageMagickからlibvipsへの移行も3月頃にされているようなので、もしかしたら…と思い確認させていただければと思いました🙏
    参考リンク:画像処理ライブラリのインストール · fjordllc/bootcamp Wiki
    libvips(Macはvips)がインストールされていない場合はそちらのインストールをしていただき、テストをもう一度実行してみていただければと思います。

  2. openslideはインストールされてますでしょうか?
    Macの場合、homebrewでvipsをインストールすると一緒にopenslideというものがインストールされているようです。
    (インストールのログは以下を参考にしました↓)
    Rails 7 のActiveStrageはデフォルトではImageMagickの代わりにlibvipsを使う - @ledsun blog
    WARNINGの表記を見る感じだと、openslideのファイルが見つからない、と言った警告のようなので、そちらが気になりました。
    こちらのコメントの中に同じようなWARNINGがあります。
    詳細は分かりませんが、vipsがインストールされていてもopenslideとの依存関係がうまくいかない場合のようです。
    vipsがインストールされている場合、$ brew install openslideをやっていただき、再度テストを実行してみていただければと思います。

もし的外れだったらすみません🙇‍♀️

Copy link
Contributor

@kurumadaisuke kurumadaisuke left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

brew install vips
brew install openslide
実行することで問題なくテスト通ること確認できました🙇‍♂️

Approveいたします🙇‍♂️

@motohiro-mm
Copy link
Contributor Author

@kurumadaisuke

WARNINGが消えたようでよかったです!🙌
ご確認いただきありがとうございました!

@motohiro-mm
Copy link
Contributor Author

@komagata

おつかれさまです!
チームメンバーからapproveしていただきましたので、レビューをお願いいたします!

Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確認させて頂きました。OKです〜🙆‍♂️

@komagata komagata merged commit 686e4cf into main Aug 16, 2024
5 checks passed
@komagata komagata deleted the chore/fix-flaky-tests branch August 16, 2024 08:31
@github-actions github-actions bot mentioned this pull request Aug 16, 2024
17 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants